<?php
Class ModelSql 
{
    /**
    * Свойства для инициализации объектов и ресурсов
    *
    * @var $msg Object         Объект очереди сообщений
    * @var $db resource        Соединение с БД
    */
    public $msg;
    private $db;

    /**
    * Конструктор
    *
    * Получает ссылку на объект очереди сообщений и производит соединение с БД
    *
    * @param &$msg Object     Ссылка на объект очереди сообщений
    * @param &$config Array Ссылка на массив параметров
    */
    function __construct(&$msg, &$config) 
    {
        $this->msg = &$msg;
        $this->config = &$config;
        // Валидатор. Очищает входные данные.
        $this->validator();
        // Cоединение с БД
        $this->db = @mysql_connect($this->config['host'], $this->config['user'], $this->config['password']) or die('Ошибка соединения: ' . mysql_error());
        // Выбор целевой БД и ее создание в случае отсутствия.
        if (!mysql_select_db($this->config['dbname'], $this->db)) 
        {
            @mysql_query("
                CREATE DATABASE ".$this->config['dbname']."
            ", $this->db) or die('Ошибка соединения: ' . mysql_error());
            @mysql_select_db($this->config['dbname'], $this->db) or die('Ошибка соединения: ' . mysql_error());    
        }
        // Проверка на существование таблиц в БД
        if(count(@mysql_query("SHOW TABLES LIKE `gb_comments`", $this->db)))
            @mysql_query("
                CREATE TABLE IF NOT EXISTS gb_comments (
                `id` int(10) NOT NULL AUTO_INCREMENT,
                `postid` int(10) NOT NULL,
                `autor` varchar(255) NOT NULL,
                `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                `text` text NOT NULL,
                UNIQUE KEY id (id)
                );
            ", $this->db) or die('Ошибка соединения: ' . mysql_error());
        if(count(@mysql_query("SHOW TABLES LIKE gb_posts", $this->db)))
            @mysql_query("
                CREATE TABLE IF NOT EXISTS `gb_posts` (
                `id` int(10) NOT NULL AUTO_INCREMENT,
                `autor` varchar(255) NOT NULL,
                `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
                `text` text NOT NULL,
                UNIQUE KEY `id` (`id`)
                );
            ", $this->db) or die('Ошибка соединения: ' . mysql_error());
    }
    /**
    * Валидатор
    *
    * Метод делает входные данные валидными
    *
    */
    private function validator() 
    {
        $autor = htmlspecialchars($_POST['autor']);
        $text = htmlspecialchars($_POST['text']);
        $autor = strip_tags($autor);
        $text = strip_tags($text);
        $autor = mysql_escape_string($autor);
        $text = mysql_escape_string($text);
        $_POST['id'] = intval($_POST['id']);
        $_POST['autor'] = $autor;
        $_POST['text'] = $text;
    }
    /**
    * Добавление в БД
    *
    * Метод добавляет в БД сообщение или комментарий в зависимости от id
    *
    * @param $id integer    Идентификатор сообщения для добавления комментария
    * @param $autor string    Имя автора
    * @param $text string    Текст сообщения или комментария
    */
    public function add($id, $autor, $text) 
    {
        if ($id) 
        {
            @mysql_query("
                INSERT INTO gb_comments (postid, autor, text)
                VALUES (".$id.", '".$autor."','".$text."');
            ") or die('Ошибка соединения: ' . mysql_error());
        } else 
        {
            @mysql_query("
                INSERT INTO gb_posts (autor, text)
                VALUES ('".$autor."','".$text."');
            ") or die('Ошибка соединения: ' . mysql_error());
        }
    }
    /**
    * Изменение сообщения
    *
    * Метод изменяет целевое сообщение в БД
    *
    * @param $id integer    Идентификатор сообщения
    * @param $text string    Текст сообщения
    */
    public function changepost($id, $text) 
    {
        @mysql_query("
            UPDATE gb_posts
            SET text = '".$text."'
            WHERE id = ".$id.";
        ") or die('Ошибка соединения: ' . mysql_error());
    }
    /**
    * Изменение комментария
    *
    * Метод изменяет целевой комментарий в БД
    *
    * @param $id integer    Идентификатор комментария
    * @param $text string    Текст комментария
    */
    public function changecomment($id, $text) 
    {
        @mysql_query("
            UPDATE gb_comments
            SET text = '".$text."'
            WHERE id = ".$id.";
        ") or die('Ошибка соединения: ' . mysql_error());
    }
    /**
    * Удаление сообщения
    *
    * Метод удаляет целевое сообщение и его комментарии из БД
    *
    * @param $id integer    Идентификатор сообщения
    */
    public function deletepost($id) 
    {
        @mysql_query("
            DELETE FROM gb_posts
            WHERE id = ".$id.";
        ") or die('Ошибка соединения: ' . mysql_error());
        @mysql_query("
            DELETE FROM gb_comments
            WHERE postid = ".$id.";
        ") or die('Ошибка соединения: ' . mysql_error());
    }
    /**
    * Удаление комментария
    *
    * Метод удаляет целевой комментарий из БД
    *
    * @param $id integer    Идентификатор комментария
    */
    public function deletecomment($id) 
    {
        @mysql_query("
            DELETE FROM gb_comments
            WHERE id = ".$id.";
        ") or die('Ошибка соединения: ' . mysql_error());
    }
    /**
    * Получение сообщений и комментариев
    *
    * Метод получает все сообщения с комментариями из БД
    *
    * @return Array         Возвращает все сообщения и комментарии
    */
    public function getall() 
    {
        $result = array();
        $this->result = @mysql_query("
            SELECT gb_posts.id, gb_posts.autor, gb_posts.time, gb_posts.text, gb_comments.id, gb_comments.autor, gb_comments.time, gb_comments.text 
            FROM `gb_posts` 
            LEFT OUTER JOIN `gb_comments` 
            ON gb_posts.id = gb_comments.postid
               ORDER BY gb_posts.time DESC, gb_comments.time DESC;
        ") or die('Ошибка соединения: ' . mysql_error());
        while($row = mysql_fetch_array($this->result, MYSQL_NUM ))
        {
            array_push($result, $row);
        }
        return $result;
    }
}